home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / tar.3.0.src Folder / menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-04  |  5.5 KB  |  290 lines  |  [TEXT/MPS ]

  1. /*
  2.  * Macintosh Tar
  3.  *
  4.  * Written by Craig Ruff.
  5.  *
  6.  * Menu handling routines.
  7.  */
  8.  
  9. #include "tar.h"
  10. #include <Resources.h>
  11.  
  12. /*
  13.  * Resource IDs for menus
  14.  */
  15. #define appleID        128
  16. #define fileID        129
  17. #define editID        130
  18. #define optionID    131
  19.  
  20. /*
  21.  * Index for each menu
  22.  */
  23. #define appleMenu    0
  24. #define fileMenu    1
  25. #define editMenu    2
  26. #define optionMenu    3
  27. #define menuCount    4
  28.  
  29. /*
  30.  * Item in Apple Menu
  31.  */
  32. #define aboutItem    1
  33.  
  34. /*
  35.  * Items in File Menu
  36.  */
  37. #define createItem    1        /* Create archive */
  38. #define extractItem    2        /* Extract archive */
  39. #define listItem    3        /* List archive */
  40. #define closeItem    5        /* Close (only for Desk Acc) */
  41. #define pgsetItem    6        /* Page setup */
  42. #define prefItem    7
  43. #define quitItem    9
  44.  
  45. /*
  46.  * Items in Edit Menu
  47.  *
  48.  * For use by Desk Accessories.
  49.  */
  50. #define undoItem    1
  51. #define cutItem        3
  52. #define copyItem    4
  53. #define pasteItem    5
  54. #define clearItem    6
  55.  
  56. /*
  57.  * Items in Options Menu
  58.  */
  59. #define convertItem    1        /* Convert newlines */
  60. #define doscvtItem    2        /* Convert DOS stype newlines */
  61. #define    oldArchItem    3        /* Old tar compatible archive creation */
  62. #define floppyItem    4        /* Use floppy as archive file */
  63. #define blockItem    5        /* Set block size */
  64. #define pageItem    7        /* Control paging of screen listing */
  65. #define printItem    8        /* Use printer instead of screen */
  66. #define typeItem    10        /* Creator/Type dialog */
  67.  
  68. /*
  69.  * Menu related variables
  70.  */
  71.  
  72. MenuHandle    menus[menuCount];
  73. Boolean        menusOK;
  74.  
  75. /*
  76.  * MenuInit - set up menu bar
  77.  *
  78.  *    Reads non-apple menus from resource file.
  79.  */
  80. Boolean
  81. MenuInit() {
  82.     int    i;
  83.     char    *routine = "\pMenuInit";
  84.  
  85.     if ((menus[appleMenu] = GetMenu(appleID)) == nil) {
  86.         OSAlert(routine, "\pGetMenu Apple Menu", nil, ResError());
  87.         return(true);
  88.     }
  89.  
  90.     AddResMenu(menus[appleMenu], 'DRVR');
  91.     if ((menus[fileMenu] = GetMenu(fileID)) == nil) {
  92.         OSAlert(routine, "\pGetMenu File Menu", nil, ResError());
  93.         return(true);
  94.     }
  95.  
  96.     if ((menus[editMenu] = GetMenu(editID)) == nil) {
  97.         OSAlert(routine, "\pGetMenu Edit Menu", nil, ResError());
  98.         return(true);
  99.     }
  100.  
  101.     if ((menus[optionMenu] = GetMenu(optionID)) == nil) {
  102.         OSAlert(routine, "\pGetMenu Option Menu", nil, ResError());
  103.         return(true);
  104.     }
  105.  
  106.     for (i = appleMenu; i < menuCount; i++)
  107.         InsertMenu(menus[i], 0);
  108.  
  109.     DDaMenus();
  110.     /*
  111.      * Setup checkmarks from preferences.
  112.      */
  113.     CheckItem(menus[optionMenu], convertItem, pref.cvtNl);
  114.     CheckItem(menus[optionMenu], doscvtItem, pref.dosCvt);
  115.     CheckItem(menus[optionMenu], oldArchItem, pref.oldArch);
  116.     CheckItem(menus[optionMenu], floppyItem, pref.floppy);
  117.     CheckItem(menus[optionMenu], pageItem, pref.autoPage);
  118.     CheckItem(menus[optionMenu], printItem, pref.doPrint);
  119.     DrawMenuBar();
  120.     return(false);
  121. }
  122.  
  123. /*
  124.  * MenuCmd - handle a menu pick or keyboard equivalent
  125.  */
  126. MenuCmd(result)
  127. long    result;
  128. {
  129.     WindowPeek    wp;
  130.     short        theItem = result & 0xffff;
  131.     short        theMenu = (result >> 16) & 0xffff;
  132.     char        name[256];
  133.     OSErr        err;
  134.     char        *routine = "\pMenuCmd";
  135.     GrafPtr        savedPort;
  136.  
  137.     switch (theMenu) {
  138.     case appleID:
  139.         if (theItem == aboutItem)
  140.             DoAboutBox();
  141.         else {
  142.             /*
  143.              * Oh boy, set up for a desk accessory.
  144.              */
  145.             GetItem(menus[appleMenu], theItem, name);
  146.             GetPort(&savedPort);
  147.             if ((err = ZeroScrap()) != noErr) {
  148.                 OSAlert(routine, "\pZeroScrap", nil, err);
  149.                 break;
  150.             }
  151.  
  152.             if ((err = TEToScrap()) != noErr) {
  153.                 OSAlert(routine, "\pTEToScrap", nil, err);
  154.                 break;
  155.             }
  156.  
  157.             (void) OpenDeskAcc(name);
  158.             SetPort(savedPort);
  159.             if (FrontWindow() != nil) {
  160.                 EDaMenus();
  161.             }
  162.         }
  163.         break;
  164.  
  165.     case fileID:
  166.         switch (theItem) {
  167.         case createItem:
  168.             ArCreate();
  169.             break;
  170.  
  171.         case extractItem:
  172.             Extract();
  173.             break;
  174.  
  175.         case listItem:
  176.             List();
  177.             break;
  178.  
  179.         case closeItem:
  180.             /*
  181.              * If the front window belongs to a Desk Acc, close it!
  182.              */
  183.             if ((wp = (WindowPeek) FrontWindow()) == nil)
  184.                 break;
  185.  
  186.             if (wp->windowKind < 0) {
  187.                 CloseDeskAcc(wp->windowKind);
  188.                 DDaMenus();
  189.             }
  190.             break;
  191.  
  192.         case pgsetItem:
  193.             if (!PrSetup())
  194.                 (void) PrStlDialog(prRecHdl);
  195.             break;
  196.  
  197.         case prefItem:
  198.             SavePreferences();
  199.             break;
  200.             
  201.         case quitItem:
  202.             doneFlag = true;
  203.             break;
  204.         }
  205.         break;
  206.  
  207.     case editID:
  208.         /*
  209.          * Send to a Desk Acc.
  210.          */
  211.         (void) SystemEdit(theItem - 1);
  212.         break;
  213.  
  214.     case optionID:
  215.         switch (theItem) {
  216.         case convertItem:
  217.             pref.cvtNl ^= true;
  218.             CheckItem(menus[optionMenu], convertItem, pref.cvtNl);
  219.             if (pref.cvtNl) {
  220.                 pref.dosCvt = false;
  221.                 CheckItem(menus[optionMenu], doscvtItem, pref.dosCvt);
  222.             }
  223.             
  224.             break;
  225.  
  226.         case doscvtItem:
  227.             pref.dosCvt ^= true;
  228.             CheckItem(menus[optionMenu], doscvtItem, pref.dosCvt);
  229.             if (pref.dosCvt) {
  230.                 pref.cvtNl = false;
  231.                 CheckItem(menus[optionMenu], convertItem, pref.cvtNl);
  232.             }
  233.             
  234.             break;
  235.             
  236.         case oldArchItem:
  237.             pref.oldArch ^= true;
  238.             CheckItem(menus[optionMenu], oldArchItem, pref.oldArch);
  239.             break;
  240.  
  241.         case floppyItem:
  242.             pref.floppy ^= true;
  243.             CheckItem(menus[optionMenu], floppyItem, pref.floppy);
  244.             break;
  245.  
  246.         case blockItem:
  247.             DoBlockSize();
  248.             break;
  249.  
  250.         case pageItem:
  251.             pref.autoPage ^= true;
  252.             CheckItem(menus[optionMenu], pageItem, pref.autoPage);
  253.             break;
  254.  
  255.         case printItem:
  256.             pref.doPrint ^= true;
  257.             CheckItem(menus[optionMenu], printItem, pref.doPrint);
  258.             break;
  259.  
  260.         case typeItem:
  261.             DoCreatorType();
  262.             break;
  263.         }
  264.         break;
  265.     }
  266.  
  267.     HiliteMenu(0);
  268.     FlushEvents(everyEvent, 0);
  269. }
  270.  
  271. /*
  272.  * DDaMenus - disable Desk Acc specific menu and menu item
  273.  */
  274. DDaMenus() {
  275.     DisableItem(menus[editMenu], 0);
  276.     DisableItem(menus[fileMenu], closeItem);
  277.     DrawMenuBar();
  278.     menusOK = true;
  279. }
  280.  
  281. /*
  282.  * EDaMenus - enable Desk Acc specific menu and menu item
  283.  */
  284. EDaMenus() {
  285.     EnableItem(menus[editMenu], 0);
  286.     EnableItem(menus[fileMenu], closeItem);
  287.     DrawMenuBar();
  288.     menusOK = false;
  289. }
  290.